//
//  RCUserModel.swift
//  RC-微博0305
//
//  Created by 任淳 on 16/3/9.
//  Copyright © 2016年 ReverChun. All rights reserved.
//

import UIKit
import AFNetworking


class RCUserModel: NSObject {
    //把用户模型定义成一个单例 要把模型的构造方法设置成私有
    static let sharedUserModel = RCUserModel()
    
    
//    保存好数据后运行崩溃 报错：-[__NSCFNumber length]: unrecognized selector sent to instance 0xb0000000966017f3' 说明有一个属性是 NSNumber 类型的 我定义成了String
    
    //定义一些属性 名称与数据字典的key要相同 不然无法kvc
    var access_token:String?
    
     //access_token的生命周期，单位是秒数。（发现expires_in的类型是个数字 不是字符串，改类型）
    var expires_in:NSTimeInterval = 0 {
        //一给expires_in赋值 一旦kvc了 就来调用didSet设置过期日期
        didSet {
                expire_date = NSDate(timeIntervalSinceNow: expires_in)
            
        }
    }
    
    //token的过期日期
    //开发者账号的过期日期是5年 普通用户的账户的过期日期是3天
    var expire_date:NSDate?
    
     //当前授权用户的UID。
    var uid:String?
    
    //当前登录用户的名称
    var name:String?
    
    //用户头像
    var avatar_large:String?
    
    //计算属性 记录token是不是过期为nil 是nil就返回false
    var isLobin:Bool {
        
        if access_token == nil {
            return false
        }else {
            return true
        }
     
    }
    //一创建就去加载数据 看token是否为空 设置成单例 要把构造方法设置成private
    override private init() {
        super.init()
        // 一创建RCUserModel，就要加载用户信息 看token是否为空
        loadUserInfo()
    }
    
    override func setValue(value: AnyObject?, forUndefinedKey key: String) {
    
    }
    
    override var description: String {
        //只读属性
        let keys = ["access_token","expires_in","uid","name","avatar_large"]
        let accountDict = self.dictionaryWithValuesForKeys(keys)
        return accountDict.description
    }
    
    //保存用户信息
    func saveUserInfo(dict:[String:AnyObject]) {
        //给当前模型 赋值
        setValuesForKeysWithDictionary(dict)
        //保存这个模型都到沙盒 但不保存模型 而是把模型的属性定义成字典 以字典的形式保存模型信息（用户信息）
        //把模型的属性们 添加到一个字典中 保存这个属性字典
        let keys = ["access_token","expires_in","uid","name","avatar_large"];
        //生成模型属性的字典
        let modelDict = dictionaryWithValuesForKeys(keys)
        //保存属性字典
        let userDefaults = NSUserDefaults.standardUserDefaults()
        userDefaults.setValue(modelDict, forKey: "userInfoModel")
    
        userDefaults.synchronize()
    }
    
    //加载已经保存在沙盒的用户数据  判断token是否过期
    func loadUserInfo() {
       let userDefaults = NSUserDefaults.standardUserDefaults()
        guard let dict = userDefaults.objectForKey("userInfoModel") as?[String:AnyObject] else {
            print("格式转换错误 无法装成字典形式")
            return
        }
        
        setValuesForKeysWithDictionary(dict)
        //OrderedDescending 比较结果降序
        if expire_date?.compare(NSDate()) == NSComparisonResult.OrderedDescending {
            print("token正常 不过期")
            
        }else {
            print("token过期了")
            access_token = nil
        }
        
        
        print(self)
    }
    
   //=============================================
    //获取token
    func getToken(code:String ,finish:(isSucceed:Bool)->()) {
        let manager = AFHTTPSessionManager()
        
        let urlStr = "https://api.weibo.com/oauth2/access_token"
        let parameters = ["client_id":"491856493","client_secret":"c1c4720029c3a44df154b5a3e5d84d3a","grant_type":"authorization_code","code":code,"redirect_uri":"http://www.baidu.com"]
        
        //Request failed: unacceptable content-type: text/plain 使用AFN最常见的错误 没有之一
        manager.responseSerializer.acceptableContentTypes?.insert("text/plain")
        //AFN发送网络请求 获取token必须用POST
        manager.POST(urlStr, parameters: parameters, progress: nil, success: { (_, result) -> Void in
            //成功的回调
            //            print(result) result是返回的数据 里面有用户的token,uid,expires_in等信息
            print(result?.classForCoder)
            
            guard let dic = result as? [String: AnyObject] else {
//                SVProgressHUD.showErrorWithStatus("result转换成字典失败")
                finish(isSucceed:false)
                return
            }
            //获取响应体中的token
            let token = dic["access_token"]
            print("^^^^^^^^^^^^^^^^")
            print(dic)
            print("^^^^^^^^^^^^^^^^")
            print(token)
            
            //拿到token 相当于拿到了服务器的钥匙 就要用token获取用户信息
            self.getUserInfo(dic, finishContinue: finish)
            
            }) { (_, error) -> Void in
                print(error)
        }
        
    }
    //用token拿到我的微博账号的信息
    //https://api.weibo.com/2/users/show.json?access_token=2.00dTBbKD0P2mRX586f11b0a13n8icC&screen_name=neveraway1993
    
    
    //使用token获取用户信息
    func getUserInfo(dict:[String : AnyObject],finishContinue:(isSucceed:Bool)->()) {
        
        let urlStr = "https://api.weibo.com/2/users/show.json"
        let token = dict["access_token"] as! String //必须转成字符串
        let uid = dict["uid"]as! String
        
        let parameter = ["access_token":token,"uid":uid]
        
        let manager = AFHTTPSessionManager()
        
        manager.GET(urlStr, parameters: parameter, progress: nil, success: { (_ , result) -> Void in
            print(result)
            
            guard var userInfoDict = result as? [String:AnyObject] else {
                finishContinue(isSucceed: false)
                print("格式转换失败")
                return
            }
            
            //把用户的两个信息字典 合并成一个
            for (key,value) in dict {
                userInfoDict[key] = value
            }
            
            print(userInfoDict)
            //合并整理好用户的信息字典以后 要保存到本地沙盒
            //可是沙盒里不能存储空值 有的字典value为空 会崩溃，所以要把字典转成模型 把模型存到沙盒
            //于是去创建一个model的类 在模型类里面进行保存用户数据到沙盒
            //调用保存方法进行保存
            RCUserModel.sharedUserModel.saveUserInfo(userInfoDict)
            finishContinue(isSucceed: true)
            
            }) { (_, error) -> Void in
        }
    }
    
    
}

